// Function的原型属性

console.log( 'name: ', Function.prototype.name );
console.log( 'length: ', Function.prototype.length );
console.log( 'constructor: ', Function.prototype.constructor );
console.log( 'toString: ', Function.prototype.toString );

console.log( '- '.repeat(20) );

function welcome(nickname){
    console.log(`热烈欢迎${nickname}来到开发喵`);
}

// 因为所有函数都是Function的实例，因此每个函数都从Function.prototype继承属性
console.log( welcome.constructor === Function.prototype.constructor ); // true
console.log( welcome.constructor === Function ); // true
// 判断 welcome 本身是否拥有一个名称是 constructor 的自有属性
console.log( Object.hasOwn( welcome, 'constructor' ) ); // false

console.log( '- '.repeat(20) );

console.log( welcome.name );
// 每个函数都有一个name属性用于获取其名称(这与Function.prototype.name无关)
console.log( Object.hasOwn( welcome, 'name' ) ); // true

console.log( welcome.length );
// 每个函数都有一个length属性用于获取其"参数个数"(这与Function.prototype.length无关)
console.log( Object.hasOwn( welcome, 'length' ) ); // true

console.log( '- '.repeat(20) );

// Function.prototype.toString()
let code = welcome.toString();
console.log( code);

console.log( '- '.repeat(20) );

try {
    console.log( Function.prototype.arguments );
} catch (e) {
    console.log( e.name, e.message );
}

console.log( '- '.repeat(20) );

try {
    console.log( Function.prototype.caller );
} catch (e) {
    console.log( e.name, e.message );
}